/*
Copyright 2017 Google Inc. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS-IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

#include "seurat/tiler/selection/selection_problem.h"

#include "ion/base/logging.h"

namespace seurat {
namespace tiler {
namespace selection {

int ItemSet::AppendItem(float cost, absl::Span<const Weight> weights) {
  int item_handle = items_.size();
  Item item;
  item.cost = cost;
  item.weight_count = weights.size();
  item.weight_start = weights_.size();
  items_.push_back(item);
  weights_.insert(weights_.end(), weights.begin(), weights.end());
  return item_handle;
}

constexpr int Token::kTokenInvalid;
constexpr int Token::kTokenAnd;
constexpr int Token::kTokenOr;
constexpr int Token::kTokenEnd;

Token::Token() : Token(kTokenInvalid) {}
Token Token::And() { return Token(kTokenAnd); }
Token Token::Or() { return Token(kTokenOr); }
Token Token::Item(int item) {
  // Items must be non-negative integers, valid indices into an ItemSet.
  DCHECK_GE(item, 0);
  return Token(item);
}
Token Token::End() { return Token(kTokenEnd); }

int Token::GetItem() const {
  DCHECK_GE(value_, 0);
  return value_;
}

}  // namespace selection
}  // namespace tiler
}  // namespace seurat
